package controller

import (
	"errors"
	"fmt"
	"gitee.com/DonHz/qimi/bluebell/dao/mysql"
	"gitee.com/DonHz/qimi/bluebell/logic"
	"gitee.com/DonHz/qimi/bluebell/models"
	"gitee.com/DonHz/qimi/bluebell/util/jwt"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

func SignUp(c *gin.Context) {
	// 1.获取参数，并进行参数校验
	var req models.SignUpParams
	if err:=c.BindJSON(&req); err!=nil{
		ResponseError(c, CodeInvalidParam)
		zap.L().Error("注册请求参数解析错误，错误：", zap.Error(err))
		return
	}
	fmt.Println("注册参数： ", req)
	if len(req.Name)==0 || len(req.Password)==0 || len(req.RePassword)==0 {
		ResponseErrorWithMsg(c, CodeInvalidParam, "用户名和密码不能为空")
		zap.L().Error("注册名称或密码不能为空")
		return
	}
	if req.Password!= req.RePassword {
		ResponseErrorWithMsg(c, CodeInvalidParam, "两次输入密码不一致")
		zap.L().Error("注册时两次输入密码不一致")
		return
	}
	// 2.业务处理
	if err:=logic.SignUp(req); err!=nil{
		if errors.Is(err, mysql.ErrorUserExist) {
			ResponseError(c, CodeUserExist)
			return
		}
		ResponseError(c, CodeServerBusy)
		zap.L().Error("注册失败", zap.Error(err))
		return
	}
	// 3.返回响应
	ResponseSuccess(c, "注册成功")
}

func Login(c *gin.Context) {
	var req models.LoginParams
	if err:=c.BindJSON(&req); err!=nil {
		ResponseErrorWithMsg(c, CodeInvalidParam, "账号或密码不能为空")
		zap.L().Error("登录请求参数解析错误，错误：", zap.Error(err))
		return
	}
	fmt.Println("登录参数： ", req)
	userId, err:=logic.Login(&req)
	if err!=nil{
		ResponseErrorWithMsg(c, CodeInvalidParam, "用户或密码错误")
		zap.L().Error("登录失败", zap.String("username", req.Name), zap.Error(err))
		return
	}
	// 验证token
	token, err:=jwt.GenToken(userId)
	if err!=nil {
		ResponseError(c, CodeServerBusy)
		zap.L().Error("生成JWT失败", zap.String("username", req.Name), zap.Error(err))
		return
	}
	c.Header("jwt", token)
	// 3.返回响应
	//ResponseSuccess(c, "登录成功")
	ResponseSuccess(c,"登录成功")
}